package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.AcaoDAO;
import br.com.duosoftware.orcamento.daos.DotacaoDAO;
import br.com.duosoftware.orcamento.daos.FuncaoDAO;
import br.com.duosoftware.orcamento.daos.ProgramaDAO;
import br.com.duosoftware.orcamento.daos.SubFuncaoDAO;
import br.com.duosoftware.orcamento.daos.UnidadeGestoraDAO;
import br.com.duosoftware.orcamento.entidades.Acao;
import br.com.duosoftware.orcamento.entidades.Dotacao;
import br.com.duosoftware.orcamento.entidades.Funcao;
import br.com.duosoftware.orcamento.entidades.Programa;
import br.com.duosoftware.orcamento.entidades.SubFuncao;
import br.com.duosoftware.orcamento.entidades.UnidadeGestora;
import br.com.duosoftware.orcamento.services.DotacaoService;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Renato
 *
 */
@ManagedBean
@ViewScoped
public class DotacaoBean implements Serializable {

    private Dotacao dotacao;
    private List<Dotacao> dotacoes;
    private DotacaoDAO dotacaoDAO;
    private DotacaoService dotacaoService;
    //
    ///****Select Itens****
    //
    private List<SelectItem> programas;
    private List<SelectItem> acoes;
    private List<SelectItem> funcoes;
    private List<SelectItem> subFuncoes;
    private List<SelectItem> unidadesGestora;

    public DotacaoBean() {

        dotacaoService = new DotacaoService();

        dotacaoDAO = new DotacaoDAO();

    }

    public Dotacao getDotacao() {
        return dotacao;
    }

    public void setDotacao(Dotacao dotacao) {
        this.dotacao = dotacao;
    }

    public List<Dotacao> getDotacoes() {
        if (dotacoes == null) {
            dotacoes = dotacaoDAO.listarDotacoes();
        }
        return dotacoes;
    }

    public void setDotacoes(List<Dotacao> dotacoes) {
        this.dotacoes = dotacoes;
    }

    public DotacaoService getDotacaoService() {
        return dotacaoService;
    }

    public void setDotacaoService(DotacaoService dotacaoService) {
        this.dotacaoService = dotacaoService;
    }

    /**
     * <b>Método que inicializa o Dotacao a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        dotacao = new Dotacao();

    }

    /**
     * <b>Método que adiciona ou edita um Dotacao</b><p>
     *
     * Após o término o método fecha o dialog de cadastro.
     * <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        dotacaoDAO.salvarOuAtualizar(dotacao);
        dotacao = new Dotacao();
        dotacoes = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgDotacao.hide()");
        requestContext.update("formDotacoes:dtDotacoes");

    }

    /**
     * <b>Método para iniciar o processo de edição de um Dotacao.</b>
     * <p>
     *
     * Ele verifica se há um Dotacao selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Dotacao selecionado o médoto abre o dialog para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (dotacao == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgDotacao.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um Dotacao.</b>
     * <p>
     *
     * Ele verifica se há um Dotacao selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Dotacao selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (dotacao == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirDotacao.show()");
        }

    }

    /**
     * <b>Método para excluir um Dotacao.</b>
     * <p>
     *
     * Ele verifica se a Dotacao selecionado para exclusão está sendo utilizado
     * por alguma outra tabela do banco. Se estiver uma mensagem de aviso é dada
     * ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            dotacaoDAO.excluir(dotacao);
            dotacao = new Dotacao();
            dotacoes = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirDotacao.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b>
     * <p>
     *
     * O método instancia um novo objeto na variável Dotacao para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        dotacao = new Dotacao();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgDotacao.hide()");
        requestContext.update("formDotacoes:dtDotacoes");

    }

    //get SelectItens
    //
    public List<SelectItem> getProgramas() {

        programas = new LinkedList<SelectItem>();

        for (Programa programa : new ProgramaDAO()
                .listarProgramas()) {

            programas.add(new SelectItem(programa, programa.toString()));

        }

        return programas;
    }

    //
    public List<SelectItem> getAcoes() {

        Programa programa = dotacao.getPrograma();

        if (programa != null) {

            acoes = new LinkedList<SelectItem>();

            for (Acao acao : new AcaoDAO()
                    .listarAcoes(programa)) {

                acoes.add(new SelectItem(acao, acao.toString()));

            }

        } else {

            acoes = null;

        }

        return acoes;
    }

    //
    public List<SelectItem> getFuncoes() {

        funcoes = new LinkedList<SelectItem>();

        for (Funcao funcao : new FuncaoDAO()
                .listarFuncoes()) {

            funcoes.add(new SelectItem(funcao, funcao.toString()));

        }

        return funcoes;
    }

    //
    public List<SelectItem> getSubFuncoes() {

        Funcao funcao = dotacao.getFuncao();

        if (funcao != null) {

            subFuncoes = new LinkedList<SelectItem>();

            for (SubFuncao subFuncao : new SubFuncaoDAO()
                    .listarSubFuncoes(funcao)) {

                subFuncoes.add(new SelectItem(subFuncao, subFuncao.toString()));

            }

        } else {

            subFuncoes = null;

        }

        return subFuncoes;
    }

    //
    public List<SelectItem> getUnidadesGestora() {
        unidadesGestora = new LinkedList<SelectItem>();
        for (UnidadeGestora unidadeGestora : new UnidadeGestoraDAO()
                .listarUnidadesGestoras()) {
            unidadesGestora.add(new SelectItem(unidadeGestora, unidadeGestora.toString()));
        }
        return unidadesGestora;
    }
}
